home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAEPaste.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  2.8 KB  |  129 lines  |  [TEXT/CWIE]

  1. // MSAEPaste.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #include "MSAEPaste.h"
  8.  
  9. #include "MSAEUtils.h"
  10. #include "MSWindow.h"        // for DPtrFromWindowPtr()
  11.  
  12. #include "MSAESelect.h"
  13.  
  14.  
  15. #pragma segment AppleEvent
  16.  
  17. // Handle a paste from scrap e.g 'paste last word of document 1' would change the
  18. // last word in the front window to what's in the scrap.
  19. // If no reference is given then the selection of the front window
  20. // is used.
  21.      
  22. pascal OSErr    DoPaste(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  23. {
  24. #ifdef __MWERKS__
  25.     #pragma unused (reply, refcon)
  26. #endif
  27.  
  28.     AEDesc        directObj = {typeNull, NULL};
  29.     TextToken    aTextToken;
  30.     short        ignore;
  31.     OSErr        err;
  32.  
  33.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  34.     // If we get an error here it just means that they haven't supplied a reference to
  35.     // an object to paste to - so paste to the current section instead.
  36.     
  37.     if (directObj.descriptorType != typeNull)
  38.         err = PasteDesc(&directObj);
  39.     else
  40.     {            // Just paste to the selection of the front window
  41.         err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);
  42.         if (noErr != err) goto done;
  43.         
  44.         err = PasteTextToken(&aTextToken);
  45.     }
  46.  
  47. done:    
  48.     (void)AEDisposeDesc(&directObj);
  49.         
  50.     return(err);
  51. }
  52.  
  53.  
  54. OSErr    PasteTextToken(TextToken* theToken)
  55. {
  56.     WindowPtr        aWindow;
  57.     DPtr            docPtr;
  58.     OSErr            err;
  59.     
  60.     aWindow = theToken->tokenWindow;
  61.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  62.     
  63.     if (! aWindow || ! docPtr)
  64.         return(errAENoSuchObject);
  65.  
  66.                     // Set this tokens selection
  67.     err = SelectTextToken(theToken);
  68.     if (noErr != err) goto done;
  69.  
  70.     TEStylPaste(docPtr->theText);     
  71.             
  72.     docPtr->dirty = true;
  73.     AdjustScrollbars(docPtr, false);
  74.     DrawPageExtras(docPtr);
  75.             
  76. done:
  77.     return(err);
  78. }
  79.  
  80. OSErr    PasteTextDesc(AEDesc* textDesc)
  81. {
  82.     TextToken        aTextToken;
  83.     Size            actualSize;
  84.     OSErr            err;
  85.  
  86.     if (typeMyText != textDesc->descriptorType)
  87.         return(errAETypeError);
  88.         
  89.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  90.  
  91.     err = PasteTextToken(&aTextToken);
  92.     
  93.     return(err);
  94. }
  95.  
  96.  
  97. OSErr    PasteDesc(AEDesc* aDesc)
  98. {
  99.     AEDesc        pasteDesc = {typeNull, NULL},
  100.                 textDesc = {typeNull, NULL};
  101.     OSErr        err;
  102.     
  103.     if (typeObjectSpecifier == aDesc->descriptorType)
  104.         err = AEResolve(aDesc, kAEIDoMinimum, &pasteDesc);
  105.     else if (typeNull != aDesc->descriptorType)
  106.         err = AEDuplicateDesc(aDesc, &pasteDesc);
  107.         
  108.     if (noErr != err) goto done;
  109.     
  110.     switch (pasteDesc.descriptorType)
  111.     {
  112.         case typeAEList:
  113.             err = errAETypeError;
  114.             // We can't handle pasting more than one item from the scrap
  115.             break;
  116.             
  117.         default:
  118.             err = AECoerceDesc(&pasteDesc, typeMyText, &textDesc);
  119.             if (noErr != err) goto done;
  120.             err = PasteTextDesc(&textDesc);
  121.     }
  122.     
  123. done:
  124.     (void)AEDisposeDesc(&pasteDesc);
  125.     (void)AEDisposeDesc(&textDesc);
  126.     
  127.     return(err);
  128. }
  129.